﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entities;
using System.Data;
using Microsoft.ApplicationBlocks.Data;
using System.Transactions;

namespace DAL
{
    public class UsuarioDAL
    {
        public static string strConexion = System.Configuration.ConfigurationManager.ConnectionStrings["ConexionBaseDesarrollo"].ConnectionString;

        public static long Nuevo(UsuarioNegocio parUsuarioNegocio)
        {
            using (TransactionScope tScope = new TransactionScope())
            {
                try
                {
                    //Antes de Guardar el Negocio, incertamos su direccion primero
                    long idDireccion = DireccionDAL.Nuevo(parUsuarioNegocio.Direccion);
                    parUsuarioNegocio.Direccion.IDDireccion = idDireccion;
                    //guardamos el negocio
                    long longRetorno = long.Parse(SqlHelper.ExecuteScalar(strConexion, "spUsuarioNegocioNuevo",
                    parUsuarioNegocio.Nombre,
                    parUsuarioNegocio.Apellido,
                    parUsuarioNegocio.DNI,
                    parUsuarioNegocio.Email,
                    parUsuarioNegocio.Contraseña,
                    parUsuarioNegocio.Telefono,
                    parUsuarioNegocio.FechaAlta,
                    parUsuarioNegocio.Negocio.IDNegocio,
                    parUsuarioNegocio.UsuarioTipo.IDUsuarioTipo,
                    parUsuarioNegocio.Direccion.IDDireccion,
                    parUsuarioNegocio.Provincia.IDProvincia,
                    parUsuarioNegocio.Pais.IDPais).ToString());
                    tScope.Complete();
                    return longRetorno;
                }
                catch (Exception ex)
                {
                    tScope.Dispose();
                    throw ex;
                }
            }
        }

        public static long Nuevo(UsuarioCliente parUsuarioCliente)
        {
            //Antes de Guardar el usuario, incertamos su direccion primero
            long idDireccion = DireccionDAL.Nuevo(parUsuarioCliente.Direccion);
            parUsuarioCliente.Direccion.IDDireccion = idDireccion;
            long longRetorno = long.Parse(SqlHelper.ExecuteScalar(strConexion, "spUsuarioClienteNuevo",
            parUsuarioCliente.Nombre,
            parUsuarioCliente.Apellido,
            parUsuarioCliente.DNI,
            parUsuarioCliente.Email,
            parUsuarioCliente.Contraseña,
            parUsuarioCliente.Telefono,
            parUsuarioCliente.FechaAlta,
            parUsuarioCliente.UsuarioTipo.IDUsuarioTipo,
            parUsuarioCliente.Direccion.IDDireccion,
            parUsuarioCliente.Provincia.IDProvincia,
            parUsuarioCliente.Pais.IDPais).ToString());
            return longRetorno;
        }

        public static void Modificar(UsuarioNegocio parUsuarioNegocio)
        {
            SqlHelper.ExecuteNonQuery(strConexion, "spUsuarioNegocioModificar",
            parUsuarioNegocio.IDUsuario,
            parUsuarioNegocio.Nombre,
            parUsuarioNegocio.Apellido,
            parUsuarioNegocio.DNI,
            parUsuarioNegocio.Email,
            parUsuarioNegocio.Contraseña,
            parUsuarioNegocio.Telefono,
            parUsuarioNegocio.FechaAlta,
            parUsuarioNegocio.FechaBaja,
            parUsuarioNegocio.UsuarioTipo.IDUsuarioTipo,
            parUsuarioNegocio.Direccion.IDDireccion,
            parUsuarioNegocio.Provincia.IDProvincia,
            parUsuarioNegocio.Pais.IDPais,
            parUsuarioNegocio.Negocio.IDNegocio);
        }

        public static void Modificar(UsuarioCliente parUsuarioCliente)
        {
            DateTime? dFechaBaja;
            if (parUsuarioCliente.FechaBaja != DateTime.MinValue)
                dFechaBaja = parUsuarioCliente.FechaBaja;
            else
                dFechaBaja = null;
            SqlHelper.ExecuteNonQuery(strConexion, "spUsuarioClienteModificar",
            parUsuarioCliente.IDUsuario,
            parUsuarioCliente.Nombre,
            parUsuarioCliente.Apellido,
            parUsuarioCliente.DNI,
            parUsuarioCliente.Email,
            parUsuarioCliente.Contraseña,
            parUsuarioCliente.Telefono,
            parUsuarioCliente.FechaAlta,
            dFechaBaja,
            parUsuarioCliente.UsuarioTipo.IDUsuarioTipo,
            parUsuarioCliente.Direccion.IDDireccion,
            parUsuarioCliente.Provincia.IDProvincia,
            parUsuarioCliente.Pais.IDPais);
        }

        public static void Eliminar(long parIDUsuario)
        {
            SqlHelper.ExecuteNonQuery(strConexion, "spUsuarioEliminar", parIDUsuario);
        }

        public static Usuario BuscarUnoPorID(long parIDUsuario, bool TraerEmpleados)
        {
            try
            {
                DataTable dt = new DataTable();
                dt = SqlHelper.ExecuteDataset(strConexion, "spUsuarioBuscarUno", parIDUsuario).Tables[0];
                if (dt.Rows.Count > 0)
                {
                    //Vemos si es un usuario de 
                    Usuario oUsuario = new Usuario();
                    DataRow dr = dt.Rows[0];
                    oUsuario.IDUsuario = long.Parse(dr["IDUsuario"].ToString());
                    oUsuario.Nombre = dr["Nombre"].ToString();
                    oUsuario.Apellido = dr["Apellido"].ToString();
                    oUsuario.Email = dr["Email"].ToString();
                    oUsuario.Contraseña = dr["Contraseña"].ToString();
                    oUsuario.Telefono = dr["Telefono"].ToString();
                    oUsuario.FechaAlta = DateTime.Parse(dr["FechaAlta"].ToString());
                    if (dr["FechaBaja"].ToString() != string.Empty)
                        oUsuario.FechaBaja = DateTime.Parse(dr["FechaBaja"].ToString());
                    oUsuario.UsuarioTipo = UsuarioTipo.BuscarUno(int.Parse(dr["IDUsuarioTipo"].ToString()));
                    oUsuario.Direccion = Direccion.BuscarUno(long.Parse(dr["IDDireccion"].ToString()));
                    oUsuario.Provincia = Provincia.BuscarUno(int.Parse(dr["IDProvincia"].ToString()));
                    oUsuario.Pais = Pais.BuscarUno(int.Parse(dr["idPais"].ToString()));
                    if (oUsuario.UsuarioTipo.Nombre.ToUpper() != "CLIENTE")
                    {
                        oUsuario.Negocio = NegocioDAL.BuscarUno(long.Parse(dr["idNegocio"].ToString()), false);
                    }
                    return oUsuario;
                }
                //sino, retorna Null
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public static Usuario BuscarUsuarioUnoPorEmail (string parEmail )
        {
            try
            {
                DataTable dt = new DataTable();
                dt = SqlHelper.ExecuteDataset(strConexion, "spUsuarioBuscarUnoPorEmail", parEmail).Tables[0];
                if (dt.Rows.Count > 0)
                {
                    //Vemos si es un usuario de 
                    Usuario oUsuario = new Usuario();
                    DataRow dr = dt.Rows[0];
                    oUsuario.IDUsuario = long.Parse(dr["IDUsuario"].ToString());
                    oUsuario.Nombre = dr["Nombre"].ToString();
                    oUsuario.Apellido = dr["Apellido"].ToString();
                    oUsuario.Email = dr["Email"].ToString();
                    oUsuario.Contraseña = dr["Contraseña"].ToString();
                    oUsuario.Telefono = dr["Telefono"].ToString();
                    oUsuario.FechaAlta = DateTime.Parse(dr["FechaAlta"].ToString());
                    if (dr["FechaBaja"].ToString() != string.Empty)
                        oUsuario.FechaBaja = DateTime.Parse(dr["FechaBaja"].ToString());
                    oUsuario.UsuarioTipo = UsuarioTipo.BuscarUno(int.Parse(dr["IDUsuarioTipo"].ToString()));
                    oUsuario.Direccion = Direccion.BuscarUno(long.Parse(dr["IDDireccion"].ToString()));
                    oUsuario.Provincia = Provincia.BuscarUno(int.Parse(dr["IDProvincia"].ToString()));
                    oUsuario.Pais = Pais.BuscarUno(int.Parse(dr["idPais"].ToString()));
                    if (oUsuario.UsuarioTipo.Nombre.ToUpper() != "CLIENTE" && oUsuario.UsuarioTipo.Nombre.ToUpper() != "ADMINISTRADOR")
                    {
                        oUsuario.Negocio = NegocioDAL.BuscarUno(long.Parse(dr["idNegocio"].ToString()), false);
                    }
                    return oUsuario;
                }
                //sino, retorna Null
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public static UsuarioNegocio BuscarUsuarioNegocioUnoPorEmail(string parEmail)
        {
            try
            {
                DataTable dt = new DataTable();
                dt = SqlHelper.ExecuteDataset(strConexion, "spUsuarioBuscarUnoPorEmail", parEmail).Tables[0];
                if (dt.Rows.Count > 0)
                {
                    //Vemos si es un usuario de 
                    UsuarioNegocio oUsuario = new UsuarioNegocio();
                    DataRow dr = dt.Rows[0];
                    oUsuario.IDUsuario = long.Parse(dr["IDUsuario"].ToString());
                    oUsuario.Nombre = dr["Nombre"].ToString();
                    oUsuario.DNI = long.Parse(dr["DNI"].ToString());
                    oUsuario.Apellido = dr["Apellido"].ToString();
                    oUsuario.Email = dr["Email"].ToString();
                    oUsuario.Contraseña = dr["Contraseña"].ToString();
                    oUsuario.Telefono = dr["Telefono"].ToString();
                    oUsuario.FechaAlta = DateTime.Parse(dr["FechaAlta"].ToString());
                    if (dr["FechaBaja"].ToString() != string.Empty)
                        oUsuario.FechaBaja = DateTime.Parse(dr["FechaBaja"].ToString());
                    oUsuario.UsuarioTipo = UsuarioTipo.BuscarUno(int.Parse(dr["IDUsuarioTipo"].ToString()));
                    oUsuario.Direccion = Direccion.BuscarUno(long.Parse(dr["IDDireccion"].ToString()));
                    oUsuario.Provincia = Provincia.BuscarUno(int.Parse(dr["IDProvincia"].ToString()));
                    oUsuario.Pais = Pais.BuscarUno(int.Parse(dr["idPais"].ToString()));
                    if (oUsuario.UsuarioTipo.Nombre.ToUpper() != "CLIENTE")
                    {
                        oUsuario.Negocio = NegocioDAL.BuscarUno(long.Parse(dr["idNegocio"].ToString()), false);
                    }
                    return oUsuario;
                }
                //sino, retorna Null
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public static UsuarioCliente BuscarUnoPorEmail(string parEmail)
        {
            try
            {
                DataTable dt = new DataTable();
                dt = SqlHelper.ExecuteDataset(strConexion, "spUsuarioBuscarUnoPorEmail", parEmail).Tables[0];
                if (dt.Rows.Count > 0)
                {
                    //Vemos si es un usuario de 
                    UsuarioCliente oUsuario = new UsuarioCliente();
                    DataRow dr = dt.Rows[0];
                    oUsuario.IDUsuario = long.Parse(dr["IDUsuario"].ToString());
                    oUsuario.Nombre = dr["Nombre"].ToString();
                    oUsuario.DNI = long.Parse(dr["DNI"].ToString());
                    oUsuario.Apellido = dr["Apellido"].ToString();
                    oUsuario.Email = dr["Email"].ToString();
                    oUsuario.Contraseña = dr["Contraseña"].ToString();
                    oUsuario.Telefono = dr["Telefono"].ToString();
                    oUsuario.FechaAlta = DateTime.Parse(dr["FechaAlta"].ToString());
                    if (dr["FechaBaja"].ToString() != string.Empty)
                        oUsuario.FechaBaja = DateTime.Parse(dr["FechaBaja"].ToString());
                    oUsuario.UsuarioTipo = UsuarioTipo.BuscarUno(int.Parse(dr["IDUsuarioTipo"].ToString()));
                    oUsuario.Direccion = Direccion.BuscarUno(long.Parse(dr["IDDireccion"].ToString()));
                    oUsuario.Provincia = Provincia.BuscarUno(int.Parse(dr["IDProvincia"].ToString()));
                    oUsuario.Pais = Pais.BuscarUno(int.Parse(dr["idPais"].ToString()));
                    return oUsuario;
                }
                //sino, retorna Null
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public static UsuarioNegocio BuscarUnoEncargadoPorIDNegocio (long parIDNegocio, bool TraerEmpleados)
        {
            try
            {
                DataTable dt = new DataTable();
                dt = SqlHelper.ExecuteDataset(strConexion, "spUsuarioBuscarEncargadoPorNegocio", parIDNegocio).Tables[0];
                if (dt.Rows.Count > 0)
                {
                    //Vemos si es un usuario de 
                    UsuarioNegocio oUsuario = new UsuarioNegocio();
                    DataRow dr = dt.Rows[0];
                    oUsuario.IDUsuario = long.Parse(dr["IDUsuario"].ToString());
                    oUsuario.Nombre = dr["Nombre"].ToString();
                    oUsuario.Apellido = dr["Apellido"].ToString();
                    oUsuario.Email = dr["Email"].ToString();
                    oUsuario.Contraseña = dr["Contraseña"].ToString();
                    oUsuario.Telefono = dr["Telefono"].ToString();
                    oUsuario.FechaAlta = DateTime.Parse(dr["FechaAlta"].ToString());
                    if (dr["FechaBaja"].ToString() != string.Empty)
                        oUsuario.FechaBaja = DateTime.Parse(dr["FechaBaja"].ToString());
                    oUsuario.UsuarioTipo = UsuarioTipo.BuscarUno(int.Parse(dr["IDUsuarioTipo"].ToString()));
                    oUsuario.Direccion = Direccion.BuscarUno(long.Parse(dr["IDDireccion"].ToString()));
                    oUsuario.Provincia = Provincia.BuscarUno(int.Parse(dr["IDProvincia"].ToString()));
                    oUsuario.Pais = Pais.BuscarUno(int.Parse(dr["idPais"].ToString()));
                    if (oUsuario.UsuarioTipo.Nombre.ToUpper() != "CLIENTE")
                    {
                        oUsuario.Negocio = NegocioDAL.BuscarUno(long.Parse(dr["idNegocio"].ToString()), false);
                    }
                    return oUsuario;
                }
                //sino, retorna Null
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public static bool ValidarEmail (string pEmail)
        {
            DataTable dt = new DataTable();
            dt = SqlHelper.ExecuteDataset(strConexion, "spUsuarioValidarEmail", pEmail).Tables[0];
            if (dt.Rows.Count > 0)
                return false;
            else
                return true;
        }

        public static Usuario Autenticar (string parEmail, string parContraseña)
        {
            try
            {
                DataTable dt = new DataTable();
                dt = SqlHelper.ExecuteDataset(strConexion, "spUsuarioAutenticar", parEmail, parContraseña).Tables[0];
                if (dt.Rows.Count > 0)
                {
                    //Vemos si es un usuario de 
                    Usuario oUsuario = new Usuario();
                    DataRow dr = dt.Rows[0];
                    oUsuario.IDUsuario = long.Parse(dr["IDUsuario"].ToString());
                    oUsuario.Nombre = dr["Nombre"].ToString();
                    oUsuario.Apellido = dr["Apellido"].ToString();
                    oUsuario.Email = dr["Email"].ToString();
                    oUsuario.Contraseña = dr["Contraseña"].ToString();
                    oUsuario.Telefono = dr["Telefono"].ToString();
                    oUsuario.FechaAlta = DateTime.Parse(dr["FechaAlta"].ToString());
                    if (dr["FechaBaja"].ToString() != string.Empty)
                        oUsuario.FechaBaja = DateTime.Parse(dr["FechaBaja"].ToString());
                    oUsuario.UsuarioTipo = UsuarioTipo.BuscarUno(int.Parse(dr["IDUsuarioTipo"].ToString()));
                    oUsuario.Direccion = Direccion.BuscarUno(long.Parse(dr["IDDireccion"].ToString()));
                    oUsuario.Provincia = Provincia.BuscarUno(int.Parse(dr["IDProvincia"].ToString()));
                    oUsuario.Pais = Pais.BuscarUno(int.Parse(dr["idPais"].ToString()));
                    if (oUsuario.UsuarioTipo.Nombre.ToUpper() != "CLIENTE" && oUsuario.UsuarioTipo.Nombre.ToUpper() != "ADMINISTRADOR")
                    {
                        oUsuario.Negocio = NegocioDAL.BuscarUno(long.Parse(dr["idNegocio"].ToString()), false);
                    }
                    return oUsuario;
                }
                //sino, retorna Null
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public static List<UsuarioNegocio> BuscarVariosPorNegocio (long parIDNegocio)
        {
            try
            {
                List<UsuarioNegocio> ListaUsuarioNegocio = new List<UsuarioNegocio>();
                DataTable dt = new DataTable();
                dt = SqlHelper.ExecuteDataset(strConexion, "spUsuarioBuscarVariosPorNegocio", parIDNegocio).Tables[0];
                if (dt.Rows.Count > 0)
                {
                    foreach (DataRow dr in dt.Rows)
                    {
                        //Vemos si es un usuario de 
                        UsuarioNegocio oUsuario = new UsuarioNegocio();
                        oUsuario.IDUsuario = long.Parse(dr["IDUsuario"].ToString());
                        oUsuario.Nombre = dr["Nombre"].ToString();
                        oUsuario.DNI = long.Parse(dr["DNI"].ToString());
                        oUsuario.Apellido = dr["Apellido"].ToString();
                        oUsuario.Email = dr["Email"].ToString();
                        oUsuario.Contraseña = dr["Contraseña"].ToString();
                        oUsuario.Telefono = dr["Telefono"].ToString();
                        oUsuario.FechaAlta = DateTime.Parse(dr["FechaAlta"].ToString());
                        if (dr["FechaBaja"].ToString() != string.Empty)
                            oUsuario.FechaBaja = DateTime.Parse(dr["FechaBaja"].ToString());
                        oUsuario.UsuarioTipo = UsuarioTipo.BuscarUno(int.Parse(dr["IDUsuarioTipo"].ToString()));
                        oUsuario.Direccion = Direccion.BuscarUno(long.Parse(dr["IDDireccion"].ToString()));
                        oUsuario.Provincia = Provincia.BuscarUno(int.Parse(dr["IDProvincia"].ToString()));
                        oUsuario.Pais = Pais.BuscarUno(int.Parse(dr["idPais"].ToString()));
                        //if (oUsuario.UsuarioTipo.Nombre.ToUpper() != "CLIENTE")
                        //{
                        //    oUsuario.Negocio = NegocioDAL.BuscarUno(long.Parse(dr["idNegocio"].ToString()), false);
                        //}
                        ListaUsuarioNegocio.Add(oUsuario);
                    }
                    return ListaUsuarioNegocio;
                }
                //sino, retorna Null
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}
